/*******************************************************************************
 *                                    ZLG
 *                         ----------------------------
 *                         innovating embedded platform
 *
 * Copyright (c) 2001-present Guangzhou ZHIYUAN Electronics Co., Ltd.
 * All rights reserved.
 *
 * Contact information:
 * web site:    https://www.zlg.cn
 *******************************************************************************/
#ifndef __HC32F4A0_EFM_H
#define __HC32F4A0_EFM_H

#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus*/
#include "core/include/hc32f4a0_regs_efm.h"
#include "common/hc32f4a0_common.h"

#define SECTOR_SIZE                  (0x2000)             /* 扇区大小*/
#define REG_LENGTH                   (32)                 /* 寄存器长度*/

/* \brief 检查 EFM 寄存器是否可写 */
#define IS_VALID_EFM_UNLOCK()        (HC32F4A0_EFM->FAPRT == 0x00000001UL)
/* \brief 检查 EFM 等待周期参数 */
#define IS_VALID_EFM_WAIT_CYCLE(x)  ((x) <= EFM_WAIT_CYCLE_15)

/* \brief EFM 指令缓存功能*/
#define EFM_INSCACHE_ON              (EFM_FRMC_ICACHE)       /* 使能指令缓存功能 */
#define EFM_INSCACHE_OFF             (0x0UL)                 /* 禁止指令缓存功能 */
/* \brief EFM 数据缓存功能*/
#define EFM_DATACACHE_ON             (EFM_FRMC_DCACHE)       /* 使能数据缓存功能 */
#define EFM_DATACACHE_OFF            (0x0UL)                 /* 禁止数据缓存功能  */
/* \biref EFM 低电压读模式*/
#define EFM_LOWVOLREAD_ON            (EFM_FRMC_LVM)          /* 低电压读模式*/
#define EFM_LOWVOLREAD_OFF           (0x0UL)
/* \brief EFM 数据缓存复位功能*/
#define EFM_CACHERST_ON              (EFM_FRMC_CRST)         /* 使能数据缓存复位功能*/
#define EFM_CACHERST_OFF             (0x0UL)                 /* 禁止数据缓存复位功能 */
/* \brief EFM 预取指功能*/
#define EFM_PREFETCH_ON              (EFM_FRMC_PREFE)        /* 使能 EFM 预取指功能*/
#define EFM_PREFETCH_OFF             (0x0UL)                 /* 禁止 EFM 预取指功能*/
/* \brief EFM 编程或擦除时的总线状态*/
#define EFM_BUS_BUSY                 (0x0UL)                 /* 编程或擦除时总线忙  */
#define EFM_BUS_RELEASE              (EFM_FWMC_BUSHLDCTL)    /* 编程或擦除时释放总线 */

/* \brief EFM 状态*/
#define EFM_FLASH0_ACT_FLASH1_ACT    (0x00000000UL)          /* FLASH 0 和 1 激活  */
#define EFM_FLASH0_STP_FLASH1_ACT    (0x00000001UL)          /* Flash 0 停止,FLASH 1 激活 */
#define EFM_FLASH0_ACT_FLASH1_STP    (0x00000002UL)          /* Flash 0 激活,Flash 1 停止 */
#define EFM_FLASH0_STP_FLASH1_STP    (0x00000003UL)          /* Flash 0 和 1 停止 */

/* \brief EFM 编程或擦除模式定义*/
#define EFM_MODE_PROGRAMSINGLE       (0x1UL)                 /* 单次编程  */
#define EFM_MODE_PROGRAMREADBACK     (0x2UL)                 /* 编程并读回模式 */
#define EFM_MODE_PROGRAMSEQUENCE     (0x3UL)                 /* 连续编程模式  */
#define EFM_MODE_ERASESECTOR         (0x4UL)                 /* 扇区擦除模式  */
#define EFM_MODE_ERASECHIP1          (0x5UL)                 /* FLASH 芯片擦除模式 */
#define EFM_MODE_ERASEFULL           (0x6UL)                 /* 完全擦除模式  */
#define EFM_MODE_READONLY            (0x0UL)                 /* 只读模式 */

/* \brief EFM 标志定义*/
#define EFM_FLAG_OTPWERR0            (EFM_FSR_OTPWERR0)       /* EFM FLASH0 操作编程/擦除错误标志 */
#define EFM_FLAG_PRTWERR0            (EFM_FSR_PRTWERR0)       /* EFM FLASH0 写保护地址错误标志 */
#define EFM_FLAG_PGSZERR0            (EFM_FSR_PGSZERR0)       /* EFM FLASH0 编程大小错误标志  */
#define EFM_FLAG_MISMTCH0            (EFM_FSR_MISMTCH0)       /* EFM FLASH0 单编程回读值不一致错误标志 */
#define EFM_FLAG_OPTEND0             (EFM_FSR_OPTEND0)        /* EFM FLASH0 操作结束标志 */
#define EFM_FLAG_CLOLERR0            (EFM_FSR_COLERR0)        /* EFM FLASH0 读写冲突错误标志  */
#define EFM_FLAG_RDY0                (EFM_FSR_RDY0)           /* EFM FLASH0 准备标志 */
#define EFM_FLAG_PRTWERR1            (EFM_FSR_PRTWERR1)       /* EFM FLASH1 写保护地址错误标志 */
#define EFM_FLAG_PGSZERR1            (EFM_FSR_PGSZERR1)       /* EFM FLASH1 编程大小错误标志  */
#define EFM_FLAG_MISMTCH1            (EFM_FSR_MISMTCH1)       /* EFM 单编程回读值不一致错误标志 */
#define EFM_FLAG_OPTEND1             (EFM_FSR_OPTEND1)        /* EFM FLASH1 操作结束标志 */
#define EFM_FLAG_CLOLERR1            (EFM_FSR_COLERR1)        /* EFM FLASH1 读写冲突错误标志  */
#define EFM_FLAG_RDY1                (EFM_FSR_RDY1)           /* EFM FLASH1 准备标志  */

#define EFM_FLAG_CLR_OTPWERR0        (EFM_FSCLR_OTPWERRCLR0)  /* EFM 清除 FLASH0 操作编程/擦除错误标志  */
#define EFM_FLAG_CLR_PRTWERR0        (EFM_FSCLR_PRTWERRCLR0)  /* EFM 清除 FLASH0 写保护地址错误标志 */
#define EFM_FLAG_CLR_PGSZERR0        (EFM_FSCLR_PGSZERRCLR0)  /* EFM 清除 FLASH0 编程大小错误标志 */
#define EFM_FLAG_CLR_MISMTCH0        (EFM_FSCLR_MISMTCHCLR0)  /* EFM 清除 FLASH0 单编程回读值不一致错误标志*/
#define EFM_FLAG_CLR_OPTEND0         (EFM_FSCLR_OPTENDCLR0)   /* EFM 清除 FLASH0 操作结束标志   */
#define EFM_FLAG_CLR_CLOLERR0        (EFM_FSCLR_COLERRCLR0)   /* EFM 清除 FLASH0 读写冲突错误标志  */
#define EFM_FLAG_CLR_PRTWERR1        (EFM_FSCLR_PRTWERRCLR1)  /* EFM 清除 FLASH1 写保护地址错误标志 */
#define EFM_FLAG_CLR_PGSZERR1        (EFM_FSCLR_PGSZERRCLR1)  /* EFM 清除 FLASH1 编程大小错误标志 */
#define EFM_FLAG_CLR_MISMTCH1        (EFM_FSCLR_MISMTCHCLR1)  /* EFM 清除 FLASH1 单编程回读值不一致错误标志*/
#define EFM_FLAG_CLR_OPTEND1         (EFM_FSCLR_OPTENDCLR1)   /* EFM 清除 FLASH1 操作结束标志  */
#define EFM_FLAG_CLR_CLOLERR1        (EFM_FSCLR_COLERRCLR1)   /* EFM 清除 FLASH1 读写冲突错误标志 */

#define EFM_FLAG_MASK          (EFM_FLAG_OTPWERR0 | EFM_FLAG_PRTWERR0 | EFM_FLAG_PGSZERR0 | \
                                EFM_FLAG_MISMTCH0 | EFM_FLAG_OPTEND0  | EFM_FLAG_CLOLERR0 | \
                                EFM_FLAG_PRTWERR1 | EFM_FLAG_PGSZERR1 | EFM_FLAG_MISMTCH1 | \
                                EFM_FLAG_OPTEND1  | EFM_FLAG_CLOLERR1 | EFM_FLAG_RDY0 | EFM_FLAG_RDY1)

#define EFM_CLR_FLAG_MASK      (EFM_FLAG_CLR_OTPWERR0 | EFM_FLAG_CLR_PRTWERR0 | EFM_FLAG_CLR_PGSZERR0 | \
                                EFM_FLAG_CLR_MISMTCH0 | EFM_FLAG_CLR_OPTEND0  | EFM_FLAG_CLR_CLOLERR0 | \
                                EFM_FLAG_CLR_PRTWERR1 | EFM_FLAG_CLR_PGSZERR1 | EFM_FLAG_CLR_MISMTCH1 | \
                                EFM_FLAG_CLR_OPTEND1  | EFM_FLAG_CLR_CLOLERR1)

/* \brief 检查 EFM 标志有效性 */
#define IS_VALID_EFM_FLAG(x)       (((x) | EFM_FLAG_MASK) == EFM_FLAG_MASK)

#define EFM_CACHE_MASK               (EFM_FRMC_CRST | EFM_FRMC_PREFE | EFM_FRMC_DCACHE | EFM_FRMC_ICACHE)
/* \brief 检查 EFM 清除标志有效性 */
#define IS_VALID_EFM_CLRFLAG(x)    (((x) | EFM_CLR_FLAG_MASK) == EFM_CLR_FLAG_MASK)

/* EFM 擦除模式参数有效性检查 */
#define IS_VALID_EFM_ERASE_MODE(x) (((x) == EFM_MODE_ERASECHIP1) || ((x) == EFM_MODE_ERASEFULL))

#define EFM_SWAP_ADDR                (0x03002000UL)
#define EFM_SWAP_DATA                (0x005A5A5AUL)

/* \brief 检查 EFM 地址范围 */
#define EFM_START_ADDR               (0x00000000UL)   /* Flash 起始地址 */
#define EFM_END_ADDR                 (0x001FFFFFUL)   /* FLASH 结束地址 */

/* \brief EFM 扇区号*/
#define EFM_SECTOR_0                (0U)
#define EFM_SECTOR_1                (1U)
#define EFM_SECTOR_2                (2U)
#define EFM_SECTOR_3                (3U)
#define EFM_SECTOR_4                (4U)
#define EFM_SECTOR_5                (5U)
#define EFM_SECTOR_6                (6U)
#define EFM_SECTOR_7                (7U)
#define EFM_SECTOR_8                (8U)
#define EFM_SECTOR_9                (9U)
#define EFM_SECTOR_10               (10U)
#define EFM_SECTOR_11               (11U)
#define EFM_SECTOR_12               (12U)
#define EFM_SECTOR_13               (13U)
#define EFM_SECTOR_14               (14U)
#define EFM_SECTOR_15               (15U)
#define EFM_SECTOR_16               (16U)
#define EFM_SECTOR_17               (17U)
#define EFM_SECTOR_18               (18U)
#define EFM_SECTOR_19               (19U)
#define EFM_SECTOR_20               (20U)
#define EFM_SECTOR_21               (21U)
#define EFM_SECTOR_22               (22U)
#define EFM_SECTOR_23               (23U)
#define EFM_SECTOR_24               (24U)
#define EFM_SECTOR_25               (25U)
#define EFM_SECTOR_26               (26U)
#define EFM_SECTOR_27               (27U)
#define EFM_SECTOR_28               (28U)
#define EFM_SECTOR_29               (29U)
#define EFM_SECTOR_30               (30U)
#define EFM_SECTOR_31               (31U)
#define EFM_SECTOR_32               (32U)
#define EFM_SECTOR_33               (33U)
#define EFM_SECTOR_34               (34U)
#define EFM_SECTOR_35               (35U)
#define EFM_SECTOR_36               (36U)
#define EFM_SECTOR_37               (37U)
#define EFM_SECTOR_38               (38U)
#define EFM_SECTOR_39               (39U)
#define EFM_SECTOR_40               (40U)
#define EFM_SECTOR_41               (41U)
#define EFM_SECTOR_42               (42U)
#define EFM_SECTOR_43               (43U)
#define EFM_SECTOR_44               (44U)
#define EFM_SECTOR_45               (45U)
#define EFM_SECTOR_46               (46U)
#define EFM_SECTOR_47               (47U)
#define EFM_SECTOR_48               (48U)
#define EFM_SECTOR_49               (49U)
#define EFM_SECTOR_50               (50U)
#define EFM_SECTOR_51               (51U)
#define EFM_SECTOR_52               (52U)
#define EFM_SECTOR_53               (53U)
#define EFM_SECTOR_54               (54U)
#define EFM_SECTOR_55               (55U)
#define EFM_SECTOR_56               (56U)
#define EFM_SECTOR_57               (57U)
#define EFM_SECTOR_58               (58U)
#define EFM_SECTOR_59               (59U)
#define EFM_SECTOR_60               (60U)
#define EFM_SECTOR_61               (61U)
#define EFM_SECTOR_62               (62U)
#define EFM_SECTOR_63               (63U)
#define EFM_SECTOR_64               (64U)
#define EFM_SECTOR_65               (65U)
#define EFM_SECTOR_66               (66U)
#define EFM_SECTOR_67               (67U)
#define EFM_SECTOR_68               (68U)
#define EFM_SECTOR_69               (69U)
#define EFM_SECTOR_70               (70U)
#define EFM_SECTOR_71               (71U)
#define EFM_SECTOR_72               (72U)
#define EFM_SECTOR_73               (73U)
#define EFM_SECTOR_74               (74U)
#define EFM_SECTOR_75               (75U)
#define EFM_SECTOR_76               (76U)
#define EFM_SECTOR_77               (77U)
#define EFM_SECTOR_78               (78U)
#define EFM_SECTOR_79               (79U)
#define EFM_SECTOR_80               (80U)
#define EFM_SECTOR_81               (81U)
#define EFM_SECTOR_82               (82U)
#define EFM_SECTOR_83               (83U)
#define EFM_SECTOR_84               (84U)
#define EFM_SECTOR_85               (85U)
#define EFM_SECTOR_86               (86U)
#define EFM_SECTOR_87               (87U)
#define EFM_SECTOR_88               (88U)
#define EFM_SECTOR_89               (89U)
#define EFM_SECTOR_90               (90U)
#define EFM_SECTOR_91               (91U)
#define EFM_SECTOR_92               (92U)
#define EFM_SECTOR_93               (93U)
#define EFM_SECTOR_94               (94U)
#define EFM_SECTOR_95               (95U)
#define EFM_SECTOR_96               (96U)
#define EFM_SECTOR_97               (97U)
#define EFM_SECTOR_98               (98U)
#define EFM_SECTOR_99               (99U)
#define EFM_SECTOR_100              (100U)
#define EFM_SECTOR_101              (101U)
#define EFM_SECTOR_102              (102U)
#define EFM_SECTOR_103              (103U)
#define EFM_SECTOR_104              (104U)
#define EFM_SECTOR_105              (105U)
#define EFM_SECTOR_106              (106U)
#define EFM_SECTOR_107              (107U)
#define EFM_SECTOR_108              (108U)
#define EFM_SECTOR_109              (109U)
#define EFM_SECTOR_110              (110U)
#define EFM_SECTOR_111              (111U)
#define EFM_SECTOR_112              (112U)
#define EFM_SECTOR_113              (113U)
#define EFM_SECTOR_114              (114U)
#define EFM_SECTOR_115              (115U)
#define EFM_SECTOR_116              (116U)
#define EFM_SECTOR_117              (117U)
#define EFM_SECTOR_118              (118U)
#define EFM_SECTOR_119              (119U)
#define EFM_SECTOR_120              (120U)
#define EFM_SECTOR_121              (121U)
#define EFM_SECTOR_122              (122U)
#define EFM_SECTOR_123              (123U)
#define EFM_SECTOR_124              (124U)
#define EFM_SECTOR_125              (125U)
#define EFM_SECTOR_126              (126U)
#define EFM_SECTOR_127              (127U)
#define EFM_SECTOR_128              (128U)
#define EFM_SECTOR_129              (129U)
#define EFM_SECTOR_130              (130U)
#define EFM_SECTOR_131              (131U)
#define EFM_SECTOR_132              (132U)
#define EFM_SECTOR_133              (133U)
#define EFM_SECTOR_134              (134U)
#define EFM_SECTOR_135              (135U)
#define EFM_SECTOR_136              (136U)
#define EFM_SECTOR_137              (137U)
#define EFM_SECTOR_138              (138U)
#define EFM_SECTOR_139              (139U)
#define EFM_SECTOR_140              (140U)
#define EFM_SECTOR_141              (141U)
#define EFM_SECTOR_142              (142U)
#define EFM_SECTOR_143              (143U)
#define EFM_SECTOR_144              (144U)
#define EFM_SECTOR_145              (145U)
#define EFM_SECTOR_146              (146U)
#define EFM_SECTOR_147              (147U)
#define EFM_SECTOR_148              (148U)
#define EFM_SECTOR_149              (149U)
#define EFM_SECTOR_150              (150U)
#define EFM_SECTOR_151              (151U)
#define EFM_SECTOR_152              (152U)
#define EFM_SECTOR_153              (153U)
#define EFM_SECTOR_154              (154U)
#define EFM_SECTOR_155              (155U)
#define EFM_SECTOR_156              (156U)
#define EFM_SECTOR_157              (157U)
#define EFM_SECTOR_158              (158U)
#define EFM_SECTOR_159              (159U)
#define EFM_SECTOR_160              (160U)
#define EFM_SECTOR_161              (161U)
#define EFM_SECTOR_162              (162U)
#define EFM_SECTOR_163              (163U)
#define EFM_SECTOR_164              (164U)
#define EFM_SECTOR_165              (165U)
#define EFM_SECTOR_166              (166U)
#define EFM_SECTOR_167              (167U)
#define EFM_SECTOR_168              (168U)
#define EFM_SECTOR_169              (169U)
#define EFM_SECTOR_170              (170U)
#define EFM_SECTOR_171              (171U)
#define EFM_SECTOR_172              (172U)
#define EFM_SECTOR_173              (173U)
#define EFM_SECTOR_174              (174U)
#define EFM_SECTOR_175              (175U)
#define EFM_SECTOR_176              (176U)
#define EFM_SECTOR_177              (177U)
#define EFM_SECTOR_178              (178U)
#define EFM_SECTOR_179              (179U)
#define EFM_SECTOR_180              (180U)
#define EFM_SECTOR_181              (181U)
#define EFM_SECTOR_182              (182U)
#define EFM_SECTOR_183              (183U)
#define EFM_SECTOR_184              (184U)
#define EFM_SECTOR_185              (185U)
#define EFM_SECTOR_186              (186U)
#define EFM_SECTOR_187              (187U)
#define EFM_SECTOR_188              (188U)
#define EFM_SECTOR_189              (189U)
#define EFM_SECTOR_190              (190U)
#define EFM_SECTOR_191              (191U)
#define EFM_SECTOR_192              (192U)
#define EFM_SECTOR_193              (193U)
#define EFM_SECTOR_194              (194U)
#define EFM_SECTOR_195              (195U)
#define EFM_SECTOR_196              (196U)
#define EFM_SECTOR_197              (197U)
#define EFM_SECTOR_198              (198U)
#define EFM_SECTOR_199              (199U)
#define EFM_SECTOR_200              (200U)
#define EFM_SECTOR_201              (201U)
#define EFM_SECTOR_202              (202U)
#define EFM_SECTOR_203              (203U)
#define EFM_SECTOR_204              (204U)
#define EFM_SECTOR_205              (205U)
#define EFM_SECTOR_206              (206U)
#define EFM_SECTOR_207              (207U)
#define EFM_SECTOR_208              (208U)
#define EFM_SECTOR_209              (209U)
#define EFM_SECTOR_210              (210U)
#define EFM_SECTOR_211              (211U)
#define EFM_SECTOR_212              (212U)
#define EFM_SECTOR_213              (213U)
#define EFM_SECTOR_214              (214U)
#define EFM_SECTOR_215              (215U)
#define EFM_SECTOR_216              (216U)
#define EFM_SECTOR_217              (217U)
#define EFM_SECTOR_218              (218U)
#define EFM_SECTOR_219              (219U)
#define EFM_SECTOR_220              (220U)
#define EFM_SECTOR_221              (221U)
#define EFM_SECTOR_222              (222U)
#define EFM_SECTOR_223              (223U)
#define EFM_SECTOR_224              (224U)
#define EFM_SECTOR_225              (225U)
#define EFM_SECTOR_226              (226U)
#define EFM_SECTOR_227              (227U)
#define EFM_SECTOR_228              (228U)
#define EFM_SECTOR_229              (229U)
#define EFM_SECTOR_230              (230U)
#define EFM_SECTOR_231              (231U)
#define EFM_SECTOR_232              (232U)
#define EFM_SECTOR_233              (233U)
#define EFM_SECTOR_234              (234U)
#define EFM_SECTOR_235              (235U)
#define EFM_SECTOR_236              (236U)
#define EFM_SECTOR_237              (237U)
#define EFM_SECTOR_238              (238U)
#define EFM_SECTOR_239              (239U)
#define EFM_SECTOR_240              (240U)
#define EFM_SECTOR_241              (241U)
#define EFM_SECTOR_242              (242U)
#define EFM_SECTOR_243              (243U)
#define EFM_SECTOR_244              (244U)
#define EFM_SECTOR_245              (245U)
#define EFM_SECTOR_246              (246U)
#define EFM_SECTOR_247              (247U)
#define EFM_SECTOR_248              (248U)
#define EFM_SECTOR_249              (249U)
#define EFM_SECTOR_250              (250U)
#define EFM_SECTOR_251              (251U)
#define EFM_SECTOR_252              (252U)
#define EFM_SECTOR_253              (253U)
#define EFM_SECTOR_254              (254U)
#define EFM_SECTOR_255              (255U)

/* \brief EFM 扇区地址*/
#define EFM_ADDR_SECTOR0            (0x00000000UL)   /* 扇区 0 */
#define EFM_ADDR_SECTOR1            (0x00002000UL)   /* 扇区  1 */
#define EFM_ADDR_SECTOR2            (0x00004000UL)   /* 扇区  2 */
#define EFM_ADDR_SECTOR3            (0x00006000UL)   /* 扇区  3 */
#define EFM_ADDR_SECTOR4            (0x00008000UL)   /* 扇区  4 */
#define EFM_ADDR_SECTOR5            (0x0000A000UL)   /* 扇区  5 */
#define EFM_ADDR_SECTOR6            (0x0000C000UL)   /* 扇区  6 */
#define EFM_ADDR_SECTOR7            (0x0000E000UL)   /* 扇区  7 */
#define EFM_ADDR_SECTOR8            (0x00010000UL)   /* 扇区  8 */
#define EFM_ADDR_SECTOR9            (0x00012000UL)   /* 扇区 9 */
#define EFM_ADDR_SECTOR10           (0x00014000UL)   /* 扇区 10 */
#define EFM_ADDR_SECTOR11           (0x00016000UL)   /* 扇区 11 */
#define EFM_ADDR_SECTOR12           (0x00018000UL)   /* 扇区 12 */
#define EFM_ADDR_SECTOR13           (0x0001A000UL)   /* 扇区 13 */
#define EFM_ADDR_SECTOR14           (0x0001C000UL)   /* 扇区 14 */
#define EFM_ADDR_SECTOR15           (0x0001E000UL)   /* 扇区 15 */
#define EFM_ADDR_SECTOR16           (0x00020000UL)   /* 扇区 16 */
#define EFM_ADDR_SECTOR17           (0x00022000UL)   /* 扇区 17 */
#define EFM_ADDR_SECTOR18           (0x00024000UL)   /* 扇区 18 */
#define EFM_ADDR_SECTOR19           (0x00026000UL)   /* 扇区 19 */
#define EFM_ADDR_SECTOR20           (0x00028000UL)   /* 扇区 20 */
#define EFM_ADDR_SECTOR21           (0x0002A000UL)   /* 扇区 21 */
#define EFM_ADDR_SECTOR22           (0x0002C000UL)   /* 扇区 22 */
#define EFM_ADDR_SECTOR23           (0x0002E000UL)   /* 扇区 23 */
#define EFM_ADDR_SECTOR24           (0x00030000UL)   /* 扇区 24 */
#define EFM_ADDR_SECTOR25           (0x00032000UL)   /* 扇区 25 */
#define EFM_ADDR_SECTOR26           (0x00034000UL)   /* 扇区 26 */
#define EFM_ADDR_SECTOR27           (0x00036000UL)   /* 扇区 27 */
#define EFM_ADDR_SECTOR28           (0x00038000UL)   /* 扇区 28 */
#define EFM_ADDR_SECTOR29           (0x0003A000UL)   /* 扇区 29 */
#define EFM_ADDR_SECTOR30           (0x0003C000UL)   /* 扇区 30 */
#define EFM_ADDR_SECTOR31           (0x0003E000UL)   /* 扇区 31 */
#define EFM_ADDR_SECTOR32           (0x00040000UL)   /* 扇区 32 */
#define EFM_ADDR_SECTOR33           (0x00042000UL)   /* 扇区 33 */
#define EFM_ADDR_SECTOR34           (0x00044000UL)   /* 扇区 34 */
#define EFM_ADDR_SECTOR35           (0x00046000UL)   /* 扇区 35 */
#define EFM_ADDR_SECTOR36           (0x00048000UL)   /* 扇区 36 */
#define EFM_ADDR_SECTOR37           (0x0004A000UL)   /* 扇区 37 */
#define EFM_ADDR_SECTOR38           (0x0004C000UL)   /* 扇区 38 */
#define EFM_ADDR_SECTOR39           (0x0004E000UL)   /* 扇区 39 */
#define EFM_ADDR_SECTOR40           (0x00050000UL)   /* 扇区 40 */
#define EFM_ADDR_SECTOR41           (0x00052000UL)   /* 扇区 41 */
#define EFM_ADDR_SECTOR42           (0x00054000UL)   /* 扇区 42 */
#define EFM_ADDR_SECTOR43           (0x00056000UL)   /* 扇区 43 */
#define EFM_ADDR_SECTOR44           (0x00058000UL)   /* 扇区 44 */
#define EFM_ADDR_SECTOR45           (0x0005A000UL)   /* 扇区 45 */
#define EFM_ADDR_SECTOR46           (0x0005C000UL)   /* 扇区 46 */
#define EFM_ADDR_SECTOR47           (0x0005E000UL)   /* 扇区 47 */
#define EFM_ADDR_SECTOR48           (0x00060000UL)   /* 扇区 48 */
#define EFM_ADDR_SECTOR49           (0x00062000UL)   /* 扇区 49 */
#define EFM_ADDR_SECTOR50           (0x00064000UL)   /* 扇区 50 */
#define EFM_ADDR_SECTOR51           (0x00066000UL)   /* 扇区 51 */
#define EFM_ADDR_SECTOR52           (0x00068000UL)   /* 扇区 52 */
#define EFM_ADDR_SECTOR53           (0x0006A000UL)   /* 扇区 53 */
#define EFM_ADDR_SECTOR54           (0x0006C000UL)   /* 扇区 54 */
#define EFM_ADDR_SECTOR55           (0x0006E000UL)   /* 扇区 55 */
#define EFM_ADDR_SECTOR56           (0x00070000UL)   /* 扇区 56 */
#define EFM_ADDR_SECTOR57           (0x00072000UL)   /* 扇区 57 */
#define EFM_ADDR_SECTOR58           (0x00074000UL)   /* 扇区 58 */
#define EFM_ADDR_SECTOR59           (0x00076000UL)   /* 扇区 59 */
#define EFM_ADDR_SECTOR60           (0x00078000UL)   /* 扇区 60 */
#define EFM_ADDR_SECTOR61           (0x0007A000UL)   /* 扇区 61 */
#define EFM_ADDR_SECTOR62           (0x0007C000UL)   /* 扇区 62 */
#define EFM_ADDR_SECTOR63           (0x0007E000UL)   /* 扇区 63 */
#define EFM_ADDR_SECTOR64           (0x00080000UL)   /* 扇区 64 */
#define EFM_ADDR_SECTOR65           (0x00082000UL)   /* 扇区 65 */
#define EFM_ADDR_SECTOR66           (0x00084000UL)   /* 扇区 66 */
#define EFM_ADDR_SECTOR67           (0x00086000UL)   /* 扇区 67 */
#define EFM_ADDR_SECTOR68           (0x00088000UL)   /* 扇区 68 */
#define EFM_ADDR_SECTOR69           (0x0008A000UL)   /* 扇区 69 */
#define EFM_ADDR_SECTOR70           (0x0008C000UL)   /* 扇区 70 */
#define EFM_ADDR_SECTOR71           (0x0008E000UL)   /* 扇区 71 */
#define EFM_ADDR_SECTOR72           (0x00090000UL)   /* 扇区 72 */
#define EFM_ADDR_SECTOR73           (0x00092000UL)   /* 扇区 73 */
#define EFM_ADDR_SECTOR74           (0x00094000UL)   /* 扇区 74 */
#define EFM_ADDR_SECTOR75           (0x00096000UL)   /* 扇区 75 */
#define EFM_ADDR_SECTOR76           (0x00098000UL)   /* 扇区 76 */
#define EFM_ADDR_SECTOR77           (0x0009A000UL)   /* 扇区 77 */
#define EFM_ADDR_SECTOR78           (0x0009C000UL)   /* 扇区 78 */
#define EFM_ADDR_SECTOR79           (0x0009E000UL)   /* 扇区 79 */
#define EFM_ADDR_SECTOR80           (0x000A0000UL)   /* 扇区 80 */
#define EFM_ADDR_SECTOR81           (0x000A2000UL)   /* 扇区 81 */
#define EFM_ADDR_SECTOR82           (0x000A4000UL)   /* 扇区 82 */
#define EFM_ADDR_SECTOR83           (0x000A6000UL)   /* 扇区 83 */
#define EFM_ADDR_SECTOR84           (0x000A8000UL)   /* 扇区 84 */
#define EFM_ADDR_SECTOR85           (0x000AA000UL)   /* 扇区 85 */
#define EFM_ADDR_SECTOR86           (0x000AC000UL)   /* 扇区 86 */
#define EFM_ADDR_SECTOR87           (0x000AE000UL)   /* 扇区 87 */
#define EFM_ADDR_SECTOR88           (0x000B0000UL)   /* 扇区 88 */
#define EFM_ADDR_SECTOR89           (0x000B2000UL)   /* 扇区 89 */
#define EFM_ADDR_SECTOR90           (0x000B4000UL)   /* 扇区 90 */
#define EFM_ADDR_SECTOR91           (0x000B6000UL)   /* 扇区 91 */
#define EFM_ADDR_SECTOR92           (0x000B8000UL)   /* 扇区 92 */
#define EFM_ADDR_SECTOR93           (0x000BA000UL)   /* 扇区 93 */
#define EFM_ADDR_SECTOR94           (0x000BC000UL)   /* 扇区 94 */
#define EFM_ADDR_SECTOR95           (0x000BE000UL)   /* 扇区 95 */
#define EFM_ADDR_SECTOR96           (0x000C0000UL)   /* 扇区 96 */
#define EFM_ADDR_SECTOR97           (0x000C2000UL)   /* 扇区 97 */
#define EFM_ADDR_SECTOR98           (0x000C4000UL)   /* 扇区 98 */
#define EFM_ADDR_SECTOR99           (0x000C6000UL)   /* 扇区 99 */
#define EFM_ADDR_SECTOR100          (0x000C8000UL)   /* 扇区 100 */
#define EFM_ADDR_SECTOR101          (0x000CA000UL)   /* 扇区 101 */
#define EFM_ADDR_SECTOR102          (0x000CC000UL)   /* 扇区 102 */
#define EFM_ADDR_SECTOR103          (0x000CE000UL)   /* 扇区 103 */
#define EFM_ADDR_SECTOR104          (0x000D0000UL)   /* 扇区 104 */
#define EFM_ADDR_SECTOR105          (0x000D2000UL)   /* 扇区 105 */
#define EFM_ADDR_SECTOR106          (0x000D4000UL)   /* 扇区 106 */
#define EFM_ADDR_SECTOR107          (0x000D6000UL)   /* 扇区 107 */
#define EFM_ADDR_SECTOR108          (0x000D8000UL)   /* 扇区 108 */
#define EFM_ADDR_SECTOR109          (0x000DA000UL)   /* 扇区 109 */
#define EFM_ADDR_SECTOR110          (0x000DC000UL)   /* 扇区 110 */
#define EFM_ADDR_SECTOR111          (0x000DE000UL)   /* 扇区 111 */
#define EFM_ADDR_SECTOR112          (0x000E0000UL)   /* 扇区 112 */
#define EFM_ADDR_SECTOR113          (0x000E2000UL)   /* 扇区 113 */
#define EFM_ADDR_SECTOR114          (0x000E4000UL)   /* 扇区 114 */
#define EFM_ADDR_SECTOR115          (0x000E6000UL)   /* 扇区 115 */
#define EFM_ADDR_SECTOR116          (0x000E8000UL)   /* 扇区 116 */
#define EFM_ADDR_SECTOR117          (0x000EA000UL)   /* 扇区 117 */
#define EFM_ADDR_SECTOR118          (0x000EC000UL)   /* 扇区 118 */
#define EFM_ADDR_SECTOR119          (0x000EE000UL)   /* 扇区 119 */
#define EFM_ADDR_SECTOR120          (0x000F0000UL)   /* 扇区 120 */
#define EFM_ADDR_SECTOR121          (0x000F2000UL)   /* 扇区 121 */
#define EFM_ADDR_SECTOR122          (0x000F4000UL)   /* 扇区 122 */
#define EFM_ADDR_SECTOR123          (0x000F6000UL)   /* 扇区 123 */
#define EFM_ADDR_SECTOR124          (0x000F8000UL)   /* 扇区 124 */
#define EFM_ADDR_SECTOR125          (0x000FA000UL)   /* 扇区 125 */
#define EFM_ADDR_SECTOR126          (0x000FC000UL)   /* 扇区 126 */
#define EFM_ADDR_SECTOR127          (0x000FE000UL)   /* 扇区 127 */
#define EFM_ADDR_SECTOR128          (0x00100000UL)   /* 扇区 128 */
#define EFM_ADDR_SECTOR129          (0x00102000UL)   /* 扇区 129 */
#define EFM_ADDR_SECTOR130          (0x00104000UL)   /* 扇区 130 */
#define EFM_ADDR_SECTOR131          (0x00106000UL)   /* 扇区 131 */
#define EFM_ADDR_SECTOR132          (0x00108000UL)   /* 扇区 132 */
#define EFM_ADDR_SECTOR133          (0x0010A000UL)   /* 扇区 133 */
#define EFM_ADDR_SECTOR134          (0x0010C000UL)   /* 扇区 134 */
#define EFM_ADDR_SECTOR135          (0x0010E000UL)   /* 扇区 135 */
#define EFM_ADDR_SECTOR136          (0x00110000UL)   /* 扇区 136 */
#define EFM_ADDR_SECTOR137          (0x00112000UL)   /* 扇区 137 */
#define EFM_ADDR_SECTOR138          (0x00114000UL)   /* 扇区 138 */
#define EFM_ADDR_SECTOR139          (0x00116000UL)   /* 扇区 139 */
#define EFM_ADDR_SECTOR140          (0x00118000UL)   /* 扇区 140 */
#define EFM_ADDR_SECTOR141          (0x0011A000UL)   /* 扇区 141 */
#define EFM_ADDR_SECTOR142          (0x0011C000UL)   /* 扇区 142 */
#define EFM_ADDR_SECTOR143          (0x0011E000UL)   /* 扇区 143 */
#define EFM_ADDR_SECTOR144          (0x00120000UL)   /* 扇区 144 */
#define EFM_ADDR_SECTOR145          (0x00122000UL)   /* 扇区 145 */
#define EFM_ADDR_SECTOR146          (0x00124000UL)   /* 扇区 146 */
#define EFM_ADDR_SECTOR147          (0x00126000UL)   /* 扇区 147 */
#define EFM_ADDR_SECTOR148          (0x00128000UL)   /* 扇区 148 */
#define EFM_ADDR_SECTOR149          (0x0012A000UL)   /* 扇区 149 */
#define EFM_ADDR_SECTOR150          (0x0012C000UL)   /* 扇区 150 */
#define EFM_ADDR_SECTOR151          (0x0012E000UL)   /* 扇区 151 */
#define EFM_ADDR_SECTOR152          (0x00130000UL)   /* 扇区 152 */
#define EFM_ADDR_SECTOR153          (0x00132000UL)   /* 扇区 153 */
#define EFM_ADDR_SECTOR154          (0x00134000UL)   /* 扇区 154 */
#define EFM_ADDR_SECTOR155          (0x00136000UL)   /* 扇区 155 */
#define EFM_ADDR_SECTOR156          (0x00138000UL)   /* 扇区 156 */
#define EFM_ADDR_SECTOR157          (0x0013A000UL)   /* 扇区 157 */
#define EFM_ADDR_SECTOR158          (0x0013C000UL)   /* 扇区 158 */
#define EFM_ADDR_SECTOR159          (0x0013E000UL)   /* 扇区 159 */
#define EFM_ADDR_SECTOR160          (0x00140000UL)   /* 扇区 160 */
#define EFM_ADDR_SECTOR161          (0x00142000UL)   /* 扇区 161 */
#define EFM_ADDR_SECTOR162          (0x00144000UL)   /* 扇区 162 */
#define EFM_ADDR_SECTOR163          (0x00146000UL)   /* 扇区 163 */
#define EFM_ADDR_SECTOR164          (0x00148000UL)   /* 扇区 164 */
#define EFM_ADDR_SECTOR165          (0x0014A000UL)   /* 扇区 165 */
#define EFM_ADDR_SECTOR166          (0x0014C000UL)   /* 扇区 166 */
#define EFM_ADDR_SECTOR167          (0x0014E000UL)   /* 扇区 167 */
#define EFM_ADDR_SECTOR168          (0x00150000UL)   /* 扇区 168 */
#define EFM_ADDR_SECTOR169          (0x00152000UL)   /* 扇区 169 */
#define EFM_ADDR_SECTOR170          (0x00154000UL)   /* 扇区 170 */
#define EFM_ADDR_SECTOR171          (0x00156000UL)   /* 扇区 171 */
#define EFM_ADDR_SECTOR172          (0x00158000UL)   /* 扇区 172 */
#define EFM_ADDR_SECTOR173          (0x0015A000UL)   /* 扇区 173 */
#define EFM_ADDR_SECTOR174          (0x0015C000UL)   /* 扇区 174 */
#define EFM_ADDR_SECTOR175          (0x0015E000UL)   /* 扇区 175 */
#define EFM_ADDR_SECTOR176          (0x00160000UL)   /* 扇区 176 */
#define EFM_ADDR_SECTOR177          (0x00162000UL)   /* 扇区 177 */
#define EFM_ADDR_SECTOR178          (0x00164000UL)   /* 扇区 178 */
#define EFM_ADDR_SECTOR179          (0x00166000UL)   /* 扇区 179 */
#define EFM_ADDR_SECTOR180          (0x00168000UL)   /* 扇区 180 */
#define EFM_ADDR_SECTOR181          (0x0016A000UL)   /* 扇区 181 */
#define EFM_ADDR_SECTOR182          (0x0016C000UL)   /* 扇区 182 */
#define EFM_ADDR_SECTOR183          (0x0016E000UL)   /* 扇区 183 */
#define EFM_ADDR_SECTOR184          (0x00170000UL)   /* 扇区 184 */
#define EFM_ADDR_SECTOR185          (0x00172000UL)   /* 扇区 185 */
#define EFM_ADDR_SECTOR186          (0x00174000UL)   /* 扇区 186 */
#define EFM_ADDR_SECTOR187          (0x00176000UL)   /* 扇区 187 */
#define EFM_ADDR_SECTOR188          (0x00178000UL)   /* 扇区 188 */
#define EFM_ADDR_SECTOR189          (0x0017A000UL)   /* 扇区 189 */
#define EFM_ADDR_SECTOR190          (0x0017C000UL)   /* 扇区 190 */
#define EFM_ADDR_SECTOR191          (0x0017E000UL)   /* 扇区 191 */
#define EFM_ADDR_SECTOR192          (0x00180000UL)   /* 扇区 192 */
#define EFM_ADDR_SECTOR193          (0x00182000UL)   /* 扇区 193 */
#define EFM_ADDR_SECTOR194          (0x00184000UL)   /* 扇区 194 */
#define EFM_ADDR_SECTOR195          (0x00186000UL)   /* 扇区 195 */
#define EFM_ADDR_SECTOR196          (0x00188000UL)   /* 扇区 196 */
#define EFM_ADDR_SECTOR197          (0x0018A000UL)   /* 扇区 197 */
#define EFM_ADDR_SECTOR198          (0x0018C000UL)   /* 扇区 198 */
#define EFM_ADDR_SECTOR199          (0x0018E000UL)   /* 扇区 199 */
#define EFM_ADDR_SECTOR200          (0x00190000UL)   /* 扇区 200 */
#define EFM_ADDR_SECTOR201          (0x00192000UL)   /* 扇区 201 */
#define EFM_ADDR_SECTOR202          (0x00194000UL)   /* 扇区 202 */
#define EFM_ADDR_SECTOR203          (0x00196000UL)   /* 扇区 203 */
#define EFM_ADDR_SECTOR204          (0x00198000UL)   /* 扇区 204 */
#define EFM_ADDR_SECTOR205          (0x0019A000UL)   /* 扇区 205 */
#define EFM_ADDR_SECTOR206          (0x0019C000UL)   /* 扇区 206 */
#define EFM_ADDR_SECTOR207          (0x0019E000UL)   /* 扇区 207 */
#define EFM_ADDR_SECTOR208          (0x001A0000UL)   /* 扇区 208 */
#define EFM_ADDR_SECTOR209          (0x001A2000UL)   /* 扇区 209 */
#define EFM_ADDR_SECTOR210          (0x001A4000UL)   /* 扇区 210 */
#define EFM_ADDR_SECTOR211          (0x001A6000UL)   /* 扇区 211 */
#define EFM_ADDR_SECTOR212          (0x001A8000UL)   /* 扇区 212 */
#define EFM_ADDR_SECTOR213          (0x001AA000UL)   /* 扇区 213 */
#define EFM_ADDR_SECTOR214          (0x001AC000UL)   /* 扇区 214 */
#define EFM_ADDR_SECTOR215          (0x001AE000UL)   /* 扇区 215 */
#define EFM_ADDR_SECTOR216          (0x001B0000UL)   /* 扇区 216 */
#define EFM_ADDR_SECTOR217          (0x001B2000UL)   /* 扇区 217 */
#define EFM_ADDR_SECTOR218          (0x001B4000UL)   /* 扇区 218 */
#define EFM_ADDR_SECTOR219          (0x001B6000UL)   /* 扇区 219 */
#define EFM_ADDR_SECTOR220          (0x001B8000UL)   /* 扇区 220 */
#define EFM_ADDR_SECTOR221          (0x001BA000UL)   /* 扇区 221 */
#define EFM_ADDR_SECTOR222          (0x001BC000UL)   /* 扇区 222 */
#define EFM_ADDR_SECTOR223          (0x001BE000UL)   /* 扇区 223 */
#define EFM_ADDR_SECTOR224          (0x001C0000UL)   /* 扇区 224 */
#define EFM_ADDR_SECTOR225          (0x001C2000UL)   /* 扇区 225 */
#define EFM_ADDR_SECTOR226          (0x001C4000UL)   /* 扇区 226 */
#define EFM_ADDR_SECTOR227          (0x001C6000UL)   /* 扇区 227 */
#define EFM_ADDR_SECTOR228          (0x001C8000UL)   /* 扇区 228 */
#define EFM_ADDR_SECTOR229          (0x001CA000UL)   /* 扇区 229 */
#define EFM_ADDR_SECTOR230          (0x001CC000UL)   /* 扇区 230 */
#define EFM_ADDR_SECTOR231          (0x001CE000UL)   /* 扇区 231 */
#define EFM_ADDR_SECTOR232          (0x001D0000UL)   /* 扇区 232 */
#define EFM_ADDR_SECTOR233          (0x001D2000UL)   /* 扇区 233 */
#define EFM_ADDR_SECTOR234          (0x001D4000UL)   /* 扇区 234 */
#define EFM_ADDR_SECTOR235          (0x001D6000UL)   /* 扇区 235 */
#define EFM_ADDR_SECTOR236          (0x001D8000UL)   /* 扇区 236 */
#define EFM_ADDR_SECTOR237          (0x001DA000UL)   /* 扇区 237 */
#define EFM_ADDR_SECTOR238          (0x001DC000UL)   /* 扇区 238 */
#define EFM_ADDR_SECTOR239          (0x001DE000UL)   /* 扇区 239 */
#define EFM_ADDR_SECTOR240          (0x001E0000UL)   /* 扇区 240 */
#define EFM_ADDR_SECTOR241          (0x001E2000UL)   /* 扇区 241 */
#define EFM_ADDR_SECTOR242          (0x001E4000UL)   /* 扇区 242 */
#define EFM_ADDR_SECTOR243          (0x001E6000UL)   /* 扇区 243 */
#define EFM_ADDR_SECTOR244          (0x001E8000UL)   /* 扇区 244 */
#define EFM_ADDR_SECTOR245          (0x001EA000UL)   /* 扇区 245 */
#define EFM_ADDR_SECTOR246          (0x001EC000UL)   /* 扇区 246 */
#define EFM_ADDR_SECTOR247          (0x001EE000UL)   /* 扇区 247 */
#define EFM_ADDR_SECTOR248          (0x001F0000UL)   /* 扇区 248 */
#define EFM_ADDR_SECTOR249          (0x001F2000UL)   /* 扇区 249 */
#define EFM_ADDR_SECTOR250          (0x001F4000UL)   /* 扇区 250 */
#define EFM_ADDR_SECTOR251          (0x001F6000UL)   /* 扇区 251 */
#define EFM_ADDR_SECTOR252          (0x001F8000UL)   /* 扇区 252 */
#define EFM_ADDR_SECTOR253          (0x001FA000UL)   /* 扇区 253 */
#define EFM_ADDR_SECTOR254          (0x001FC000UL)   /* 扇区 254 */
#define EFM_ADDR_SECTOR255          (0x001FE000UL)   /* 扇区 255 */

#define EFM_OTP_BLOCK16             (0x03000000UL)   /* OTP 块16  2K 字节 */
#define EFM_OTP_BLOCK17             (0x03000800UL)   /* OTP 块17  2K 字节 */
#define EFM_OTP_BLOCK181            (0x030017FCUL)   /* OTP 块181 4 字节 */

/* \brief 检查 EFM 扇区编号参数有效性 */
#define IS_VALID_EFM_SECTOR_NUM(x)         ((x) <= 256U)
/* \brief 检查 EFM 地址参数有效性 */
#define IS_VALID_EFM_ADDR(x)              (((x) <= EFM_END_ADDR)  ||  \
                                          (((x) >= EFM_OTP_BLOCK16) && ((x) <= EFM_OTP_BLOCK181)))

/* \brief 检查 EFM 地址对齐有效性 */
#define IS_VALID_EFM_ADDR_ALIGNMENT(x)    (((x) | 0xFFFFFFFCUL) == 0xFFFFFFFCUL)
/* \brief 检查 EFM 芯片擦除地址参数有效性 */
#define IS_VALID_EFM_CHIP_ERASE_ADDR(x)    ((x) <= EFM_END_ADDR)

/**
 * \brief EFM 访问写使能
 */
static inline void efm_unlock(void) {
    WRITE_REG16(HC32F4A0_EFM->FAPRT, EFM_SECRET_KEY1);
    WRITE_REG16(HC32F4A0_EFM->FAPRT, EFM_SECRET_KEY2);
}

/**
 * \brief EFM 访问写保护
 */
static inline void efm_lock(void) {
    WRITE_REG16(HC32F4A0_EFM->FAPRT, 0x1111U);
}

/**
 * \brief EFM 擦写模式寄存器写使能
 */
void efm_fwmc_unlock(void);
/**
 * \brief EFM 擦写模式寄存器写保护
 */
void efm_fwmc_lock(void);
/**
 * \brief EFM 读等待周期设置
 *
 * \param[in] wait_cycle 设置的等待周期
 *
 * \retval 成功返回0
 */
int efm_wait_cycle_set(uint32_t wait_cycle);
/**
 * \brief 根据地址获取扇区编号
 *
 * \param[in] addr 扇区起始地址
 *
 * \retval 成功返回扇区编号
 */
int efm_sec_num_get(uint32_t addr);
/**
 * \brief EFM 单扇区写使能
 *
 * \param[in] sec_num 扇区编号
 *
 * \retval 成功返回 0
 */
void efm_sec_single_unlock(uint8_t sec_num);
/**
 * \brief EFM 单扇区写保护
 *
 * \param[in] sec_num 扇区编号
 *
 * \retval 成功返回 0
 */
void efm_sec_single_lock(uint8_t sec_num);
/**
 * \brief EFM 连续扇区写使能
 *
 * \param[in] addr_start 扇区起始地址
 * \param[in] sec_cnt    写使能的扇区数量
 *
 * \retval 成功返回 0
 */
int efm_sec_sequential_unlock(uint32_t addr_start, uint16_t sec_cnt);
/**
 * \brief EFM 连续扇区写保护
 *
 * \param[in] addr_start 扇区起始地址
 * \param[in] sec_cnt    写保护的扇区数量
 *
 * \retval 成功返回 0
 */
int efm_sec_sequential_lock(uint32_t addr_start, uint16_t sec_cnt);
/**
 * \brief EFM 扇区擦除
 *
 * \param[in] addr 要擦除的扇区的起始地址
 *
 * \retval 成功返回 0
 */
int efm_sec_erase(uint32_t addr);
/**
 * \brief EFM 芯片擦除
 *
 * \param[in] erase_mode 擦除模式
 * \param[in] addr       擦除起始地址
 *
 * \retval 成功返回 0
 */
int efm_chip_erase(uint32_t erase_mode, uint32_t addr);
/**
 * \brief EFM 单次编程
 *
 * \param[in] addr  编程地址
 * \param[in] data  编程数据
 *
 * \retval 成功返回 0
 */
int efm_single_program(uint32_t addr, uint32_t data);
/**
 * \brief EFM 编程回读
 *
 * \param[in] addr  编程地址
 * \param[in] data  编程数据
 *
 * \retval 成功返回 0
 */
int efm_program_readback(uint32_t addr, uint32_t data);
/**
 * \brief EFM 连续编程
 *
 * \param[in] addr  编程起始地址
 * \param[in] len   编程长度
 * \param[in] p_buf 要写入的缓存
 *
 * \retval 成功返回 0
 */
int efm_sequence_program(uint32_t        addr,
                         uint32_t        len,
                         const uint32_t *p_buf);
/**
 * \brief EFM 初始化
 *
 * \retval 成功返回 0
 */
int efm_init(void);
/**
 * \brief EFM 反初始化
 */
void efm_deinit(void);
#ifdef __cplusplus
}
#endif  /* __cplusplus  */


#endif


